<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
  <title>Xen Configuration Syntax</title>
</head>
<body>
<center>
<h1>Xen Configuration Syntax</h1>
<br>
<!-- Version 0.1<br>2004 June 21<br> -->
Version 0.2<br>2004 July 19<br>
</center>

<h1>Xen Configuration</h1>
The Xen virtual machine creation tools provide command-line interfaces and
HTTP interfaces to creating virtual machines. Underneath all these interfaces
virtual machine configuration data is represented in a common configuration syntax
called SXP.

The SXP syntax is s-expressions (sxprs), a simple bracketed abstract syntax.
Python lists are used to represent its parsed form, with a support
api providing  access to fields and values (class xen.xend.sxp).

<h1>SXP syntax</h1>
<p>A general s-expression has the syntax:
<code><pre>
s-exp = '(' s-exp* ')' | atom | string
</pre></code>
Where an <code>atom</code> is an unquoted string, such as fred or /domain/0.
A <code>string</code> is a quoted string, supporting the usual escape sequences.
Strings support single or double quotes: 'fred 1' or "fred 2" are both accepted.
The characters ()[]&lt;&gt{} are separators.

<p>An <code>element</code> is an s-expression representing data similar to XML.
It has the form:
<code><pre>
element    = '(' name attributes? value* ')'
name       = atom
attributes = '(' '@' attribute* ')'
attribute  = '(' attrname attrval ')'
attrname   = atom
attrval    = atom | string
value      = element | atom | string
</pre></code>
The <code>name</code> is the element name (roughly indentifying its type).
The <code>attributes</code> is a list of attribute-values.
We usually prefer to avoid using attributes, and use sub-elements instead.
As in XML, any element may have the attribute <code>id</code> to give it an identifier
for later reference.

<h1>VM configuration</h1>
A vm configuration is a single SXP vm element, with subelements for
vm parameters and devices. The supported elements and their fields
are listed below.

<h2>(vm) element</h2>
The top-level element, a virtual machine configuration.
<ul>
    <li>name: string, required. Domain name.
    <li>id: int, optional, default generated. Domain unique id.
    <li>memory: int, required. Domain memory in MB.
    <li>maxmem: int, optional. Maximum domain memory in MB.
    <li>cpu: int, optional. Cpu to run on.
    <li>cpu_weight, float, optional, default 1. Cpu weight - controls share of CPU.
    <li>image: linux | netbsd | ..., required. Domain image (OS-specific element).
    <li>backend: any backend device type, optional, default none.
    <li>device: any device type, optional, repeats. Device.
    <li>restart: string, optional, default onreboot. Restart mode, one of
        <ul><li>onreboot: restart the domain when it exits with code reboot.
            <li>always: always restart the domain when it exits.
            <li>never:  never restart the domain.
        </ul>
    <li>console: int, optional, default 9600 + domain id. Console port.
</ul>

<h2>(image (linux)) element</h2>
Defines a linux kernel image and its command-line parameters.
<ul>
    <li>kernel: string, required. Kernel image file (absolute path).
    <li>root: string, optional. Root device.
    <li>ip: string, optional. IP address specifier.
    <li>ramdisk: string, optional, default none. Ramdisk file (absolute path).
    <li>args: string, optional. Extra kernel args.
</ul>

<h2>(image (netbsd)) element</h2>
Defines a netbsd kernel image and its command-line parameters.
<ul>
    <li>kernel: string, required. Kernel image file.
    <li>root: string, optional. Root device.
    <li>ip: string, optional. IP address specifier.
    <li>ramdisk: string, optional, default none. Ramdisk file.
    <li>args: string, optional. Extra kernel args.
</ul>

<h2>(backend (blkif)) element</h2>
The vm is a block device backend.
The vm can have pci devices configured.

<h2>(backend (netif)) element</h2>
The vm is a net device backend.

<h2>(device (vif)) element</h2>
Defines a virtual network interface.
<ul>
    <li>mac: string, required. Interface MAC address.
    <li>bridge: string, optional, default system-dependent. Bridge to connect to.
    <li>script: string, optional, default system-dependent. Vif script to use
        when bringing the interface up or down.
    <li>ip: IP address, optional, no default. May be repeated. An IP address
    or CIDR-format subnet the vif may use.
    <li>backend: domain name or id, optional, default 0.
    Defines the domain to use as  the backend for the interface.
</ul>

<h2>(device (vbd)) element</h2>
Defines a virtual block device.
<ul>
    <li>uname: string, required. Virtual block device id, e.g phys:hda1.
    <li>dev: string, required. Device file name in domain, e.g. xda1.
    <li>mode: string, optional, default r. Read-write mode: r | rw | w.
    <li>backend: domain name or id, optional, default 0.
     Defines the domain to use as the backend for the device.
</ul>
The uname field defines the device being exported from the block device
controller. The dev field defines the device name the vm will see.
The device is read-only unless the mode contains w.

<h2>(device (pci)) element</h2>
Defines a pci device. 
<ul>
    <li>bus: int, required. PCI bus id.
    <li>dev: int, required. PCI dev id.
    <li>func: int, required. PCI func id.
</ul>
The bus, dev or func may be given in hex,
e.g. 0xff. With no leading 0x they are interpreted as decimal.

<h1>Examples</h1>
<p> A vm  with 64 MB memory, root on /dev/xda1 (mapped from /dev/hda1),
one vif with default MAC.
<code><pre>
(vm
    (name xendom1)
    (memory 64)
    (image
        (linux
            (kernel /boot/vmlinuz-2.6.12-xen)
            (ip ::::xendom1:eth0:dhcp)
            (root /dev/xda1)
            (args 'rw fastboot 4')
        )
    )
    (device (vif))
    (device (vbd (uname phy:hda1) (dev xda1) (mode w)))
)
</pre></code>

</body>
</html>
